题目是160道逆向破解题目的二道

首先点击运行,发现运行不了,原因是缺少了一个dll文件,直接百度搜索下载道这个exe的根目录里就行了,点击运行,是一个用户密码注册的小窗口

在这里插入图片描述
直接拖入od,右键智能搜索,找到try again等报错的字样,往上面翻两下就能看到我们的关键点je了,右键nop填充就好了。

在这里插入图片描述
在用一下另外一种寻找关键点的方法,先运行并输入伪码,然后停止运行程序,查看堆栈视图,
在这里插入图片描述
这些函数名称看着都很生疏,百度一下,是用vb写的,看后面的来源,发现rtcmsgbox是来源于afkayas的,百度一下知道这个函数是调用消息框的函数。u送一直接右键show call。
在这里插入图片描述
就找到了。

还有一种方法,我们ctrl + n可以看到当前模块的名称列表,加粗样式
可以看到那个……cmp函数,右键下断点,在这里插入图片描述
可以看到下了两个断点,说明有两个函数,运行程序跑到断点处,然后看堆栈窗口
在这里插入图片描述
可以看到这个call传进去了两个参数,一个是我们自己输入的密码,一个是一串字符串,很有可能就是正确的注册码。试一下
在这里插入图片描述
正确!
我么们再改一下用户名,发现注册码由错误了,说明注册码始于用户名有关系的。

接下来是注册机部分

注册机我还不会搞,所以就找了两篇教程学了一下,首先是第一篇的方法。

先找到函数头ebp然后单步调试,注意查看eax的值,一位内函数的返回值一般都会储存在eax中,

image-20210809162927862

可以看到这里可以获取我们输入的用户名并传进下面的call中并返回用户名的长度。

image-20210809165201286

继续往下运行可以看到这里获取了输入的用户名的首字符,并在下面的call中返回了首字符的ASCII码(十六进制的)。

一直往下单步运行,可以发现下图的区域

image-20210809171250491

这里的1658111和下面的akai你接起来就是我们的注册码,所以寻找一下生成这个注册码的地方。

重新找一遍看看是哪里生成的注册码,发现是在这里生成的。

image-20210809171522748

说明这个call就是计算注册码的函数。

进入以后

可以看到这个就是我们计算注册码的函数。寻找生成注册码的call直到找到为止,emm,找到了一组循环,这个循环应该就是将实力禁止转换为十进制。那么我们再分析前面的代码。

结合前面的获取字符串长度和字符串首字符的ascii码的函数,可以知道注册码的生成方法

首先将字符串的长度赋值给edi然后再将edi*0x17cfb,然后加上首字符的ascii码值,最后转化为十六进制。

分析完毕,中间有很多不懂得地方卡住了,这里有的教程讲的非常好。